/*!

Math.uuid.js (v1.4)

http://www.broofa.com

mailto:robert@broofa.com

 

Copyright (c) 2010 Robert Kieffer

Dual licensed under the MIT and GPL licenses.

*/

 

/*

 * Generate a random uuid.

 *

 * USAGE: Math.uuid(length, radix)

 *   length - the desired number of characters

 *   radix  - the number of allowable values for each character.

 *

 * EXAMPLES:

 *   // No arguments  - returns RFC4122, version 4 ID

 *   >>> Math.uuid()

 *   "92329D39-6F5C-4520-ABFC-AAB64544E172"

 *

 *   // One argument - returns ID of the specified length

 *   >>> Math.uuid(15)     // 15 character ID (default base=62)

 *   "VcydxgltxrVZSTV"

 *

 *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)

 *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)

 *   "01001010"

 *   >>> Math.uuid(8, 10) // 8 character ID (base=10)

 *   "47473046"

 *   >>> Math.uuid(8, 16) // 8 character ID (base=16)

 *   "098F4D35"

 */

(function() {

  // Private array of chars to use

  var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');

 

  Math.uuid = function (len, radix) {

    var chars = CHARS, uuid = [], i;

    radix = radix || chars.length;

 

    if (len) {

      // Compact form

      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];

    } else {

      // rfc4122, version 4 form

      var r;

 

      // rfc4122 requires these characters

      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';

      uuid[14] = '4';

 

      // Fill in random data.  At i==19 set the high bits of clock sequence as

      // per rfc4122, sec. 4.1.5

      for (i = 0; i < 36; i++) {

        if (!uuid[i]) {

          r = 0 | Math.random()*16;

          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];

        }

      }

    }

 

    return uuid.join('');

  };

 

  // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance

  // by minimizing calls to random()

  Math.uuidFast = function() {

    var chars = CHARS, uuid = new Array(36), rnd=0, r;

    for (var i = 0; i < 36; i++) {

      if (i==8 || i==13 ||  i==18 || i==23) {

        uuid[i] = '-';

      } else if (i==14) {

        uuid[i] = '4';

      } else {

        if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;

        r = rnd & 0xf;

        rnd = rnd >> 4;

        uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];

      }

    }

    return uuid.join('');

  };

 

  // A more compact, but less performant, RFC4122v4 solution:

  Math.uuidCompact = function() {

    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {

      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);

      return v.toString(16);

    });

  };

})();